이펙티브 자바 [이펙티브 자바] 클래스와 인터페이스 Item15 - 클래스와 멤버의 접근 권한을 최소화하라 클래스와 멤버의 접근 권한을 최소화하라. 그 중 하나가 접근 제어 메커니즘이다. 이는 클래스, 인터페이스, 멤버의 접근 허용 범위(접근성)를 제어하는 것이다. 이때 접근성은 접근 제한자로 명시될 수 있다. 클래스나 인터페이스, 멤버등의 접근 권한을 명시한다. private - 멤버를 선언한 톱레벨 클래스에서만 접근 가능. package-private - 해당 패키지 안의 모든 클래스에서 접근... 공부Effective Java스터디이펙티브 자바JavaEffective Java [ ITEM 22 ] 인터페이스는 타입을 정의하는 용도로만 사용하라 인터페이스 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할 클래스가 어떤 인터페이스를 구현 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해주는 것 인터페이스는 이 용도로만 사용해야 한다! 상수 인터페이스 상수 인터페이스 메서드 없이, 상수를 뜻하는 static final 필드로만 가득 찬 인터페이스 정규화된 이름을 쓰는 걸 피하고자 인터페이스를 구현하곤 한다. 상수 ... Effective Java이펙티브 자바Effective Java [이펙티브 자바] 클래스와 인터페이스 Item16 - public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 자바에서는 추상화의 기본 단위로 클래스(Class)와 인터페이스(Interface) 를 정의하고 있고, 이는 곧 자바의 심장과도 같다. 다른 컴포넌트에서 해당 클래스 데이터 필드에 직접 접근이 가능하다. 그 말은, 캡슐화(Encapsulation)가 전혀 안되기 때문에 그에 따른 장점도 얻을 수 없다는 말이다. API를 수정하지 않고는 내부 표현을 바꿀 수 없다. 불변식을 보장할 수 없다. ... 자바공부Effective Java스터디이펙티브 자바JavaEffective Java [이펙티브 자바] 클래스와 인터페이스 Item17 - 변경 가능성을 최소화하라 일반적으로 불변 클래스는 가변 클래스에 비해 설계하고 구현하고 사용하기가 쉽고, 그 외에, 인스턴스의 값을 변경할 수 있는 로직이 들어가는 메서드는 안된다. 클래스를 확장할 수 없도록 한다. 기술적으로 기본 타입 필드나 불변 객체를 참조하는 필드를 public final로만 선언해도 불변은 된다. 코드에서 사칙연산 부분을 보면, 인스턴스 본인의 필드 값을 바꾸지 않고 결과만 리턴하는 것을 볼... 자바공부Effective Java스터디이펙티브 자바JavaEffective Java 이펙티브 자바 아이템6 정리 String 인스턴스 아래 코드는 실행 될 때 마다 String 인스턴스를 새로 만든다. 아래 코드는 새로운 인스턴스를 만들지만 하나의 String 인스턴스를 사용한다. 이 방법은 문자열 리터럴 생성 방식으로 String Contstant Pool이란 영역에 저장된다. String.maches()의 성능 이슈 아래 코드는 String.marches의 내부 코드다. 코드를 보면 matches를... Effective Java이펙티브 자바Effective Java 아이템1: 생성자 대신 정적 팩터리 메서드를 고려하라 해당 클래스의 인스턴스를 반환하는 단순한 정적 메서드 정적 팩터리 메서드가 생성자보다 좋은 점 이름을 가질 수 있다 정적 팩터리 메서드 BigInteger.probablePrime이 더 직관적이다. 반면, 정적 팩터리 메서드는 하나의 시그니처로 하나의 생성자만 가질 수 있는 제약을 받지 않는다. 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다. 인터페이스 기반 프레임워크: 인터페이... 이펙티브 자바이펙티브 자바 Effective Java 40장 - @Override 애너테이션을 일관되게 사용하라 사용자가 스스로 정의한 Class를 자료형으로 하는 Set 자료구조를 사용할 때에는 중복을 체크해주기 위한 equals, hashcode 등을 올바르게 재정의 해줄 필요가 있다. (Override) 이 부분에서 주로 실수하는 부분은 바로 equals를 재정의 할 때 '재정의(Override)'가 아니라 '다중정의(Overloading)'를 하는 것이다. 먼저 아래와 같은 코드는 a부터 z까지... 자바이펙티브 자바이펙티브 자바 [TIL] 2021. 02.22 코드 자체가 동작이 명확하지 않고 코드 라인이 길어지면 람다 지양 비교자 생성 메서드 혹은 List 인터페이스가 추가된 메서드 사용 2. 람다보다는 메서드 참조를 사용하라. 람다보다 더욱 간결하게 만드는 방법 : 메서드 참조(Method reference) 매개변수 수가 늘어날수록 메서드 참조로 제거 가능. 람다가 메서드 참조보다 간결할 때가 있다 메서드 참조의 유형 5가지 메서드 참조 유형... 알고리즘이펙티브 자바java streamTILTIL [이펙티브 자바] 아이템 2. 생성자에 매개변수가 많다면 빌더를 고려하라 타입이 같은 매개변수가 연달아 늘어서 있으면 찾기 어려운 버그로 이어질 수 있다. 매개변수가 없는 생성자로 객체를 만든 후, setter 메서드를 호출해 원하는 매개변수 값을 설정하는 방식 객체 하나를 만들려면 메서드를 여러 개 호출해야 한다. 클라이언트는 필요한 객체를 직접 만드는 대신, 필수 매개변수 만으로 생성자(혹은 정적 팩터리)를 호출해 빌더 객체를 얻는다. 이 빌더의 Setter ... 이펙티브 자바이펙티브 자바 [이펙티브 자바] 아이템28 | 배열보다는 리스트를 사용하라 반면, 리스트의 경우 서로 다른 타입 Type1, Type2가 있을 때, List<Type1>은 List<Type2>의 하위 타입도 아니고 상위 타입도 아니다. 배열은 이런 오류 발생을 런타임시에 알 수 있지만 리스트를 사용하면 컴파일시에 바로 알 수 있다. 그래서 Long 타입 배열에 String 타입 데이터를 입력하려고하면 ArrayStoreException이 발생한다. 반면, 리스트는 ... 이펙티브 자바이펙티브 자바 [이펙티브 자바] 객체의 생성과 파괴 Item7 - 다 쓴 객체 참조를 해제하라 "2장 - 객체의 생성과 파괴" 는 다음과 같은 기준으로 맥락을 잡고 있다. 객체를 만들어야 할 때는 언제인가 객체를 만들지 말아야 할 때는 언제인가 객체를 제 때에 파괴시키는 방법은 무엇인가 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. 다 쓴 객체 참조를 해체하라. 내가 배웠던 자바의 가장 큰 특징 중 하나는 바로 가비지 컬렉터가 있다는 것이다. 동적 메모리를 사용하기 때문에 사... Effective JavaJava이펙티브 자바스터디공부Effective Java [Java] String 의 matches 대신 Pattern 아래는 숫자인지 판단하는 정규식의 예시이다. 정규식에 대한 정보는 에서 확인할 수 있다. 위의 코드는 음수양수 모두 가능하며 0에서 9사이의 값이 한개 또는 그 이상 있을 수 있는지를 판단한다. 즉, 숫자인지 판단하는 메서드이다. 하지만 String 에서 제공하는 matches 는 내부적으로 Pattern 객체를 생성한다. String.matches 를 이용하여 검증을 한다면 매번 Patte... Java이펙티브 자바Java [이펙티브 자바] 아이템29 | 이왕이면 제네릭 타입으로 만들라 일반 클래스를 제네릭 타입으로 변경. 일반 클래스를 제네릭 타입 클래스로 바꾼다고 해도 클라이언트에는 아무런 해가 없다. 위와 같은 코드 상태로는 스택에서 꺼낸 객체를 형변환해야 하는데 이때 런타임 오류가 발생할 가능성이 있다. 따라서 제네릭 타입 클래스로 바꾸는것이 좋다. 일반 클래스에서 제네릭 타입 클래스로 만드는 시작은 타입 매개변수를 추가하는 것이다. [제네릭 스택으로 변경] 위 코드... 이펙티브 자바이펙티브 자바
[이펙티브 자바] 클래스와 인터페이스 Item15 - 클래스와 멤버의 접근 권한을 최소화하라 클래스와 멤버의 접근 권한을 최소화하라. 그 중 하나가 접근 제어 메커니즘이다. 이는 클래스, 인터페이스, 멤버의 접근 허용 범위(접근성)를 제어하는 것이다. 이때 접근성은 접근 제한자로 명시될 수 있다. 클래스나 인터페이스, 멤버등의 접근 권한을 명시한다. private - 멤버를 선언한 톱레벨 클래스에서만 접근 가능. package-private - 해당 패키지 안의 모든 클래스에서 접근... 공부Effective Java스터디이펙티브 자바JavaEffective Java [ ITEM 22 ] 인터페이스는 타입을 정의하는 용도로만 사용하라 인터페이스 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할 클래스가 어떤 인터페이스를 구현 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해주는 것 인터페이스는 이 용도로만 사용해야 한다! 상수 인터페이스 상수 인터페이스 메서드 없이, 상수를 뜻하는 static final 필드로만 가득 찬 인터페이스 정규화된 이름을 쓰는 걸 피하고자 인터페이스를 구현하곤 한다. 상수 ... Effective Java이펙티브 자바Effective Java [이펙티브 자바] 클래스와 인터페이스 Item16 - public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 자바에서는 추상화의 기본 단위로 클래스(Class)와 인터페이스(Interface) 를 정의하고 있고, 이는 곧 자바의 심장과도 같다. 다른 컴포넌트에서 해당 클래스 데이터 필드에 직접 접근이 가능하다. 그 말은, 캡슐화(Encapsulation)가 전혀 안되기 때문에 그에 따른 장점도 얻을 수 없다는 말이다. API를 수정하지 않고는 내부 표현을 바꿀 수 없다. 불변식을 보장할 수 없다. ... 자바공부Effective Java스터디이펙티브 자바JavaEffective Java [이펙티브 자바] 클래스와 인터페이스 Item17 - 변경 가능성을 최소화하라 일반적으로 불변 클래스는 가변 클래스에 비해 설계하고 구현하고 사용하기가 쉽고, 그 외에, 인스턴스의 값을 변경할 수 있는 로직이 들어가는 메서드는 안된다. 클래스를 확장할 수 없도록 한다. 기술적으로 기본 타입 필드나 불변 객체를 참조하는 필드를 public final로만 선언해도 불변은 된다. 코드에서 사칙연산 부분을 보면, 인스턴스 본인의 필드 값을 바꾸지 않고 결과만 리턴하는 것을 볼... 자바공부Effective Java스터디이펙티브 자바JavaEffective Java 이펙티브 자바 아이템6 정리 String 인스턴스 아래 코드는 실행 될 때 마다 String 인스턴스를 새로 만든다. 아래 코드는 새로운 인스턴스를 만들지만 하나의 String 인스턴스를 사용한다. 이 방법은 문자열 리터럴 생성 방식으로 String Contstant Pool이란 영역에 저장된다. String.maches()의 성능 이슈 아래 코드는 String.marches의 내부 코드다. 코드를 보면 matches를... Effective Java이펙티브 자바Effective Java 아이템1: 생성자 대신 정적 팩터리 메서드를 고려하라 해당 클래스의 인스턴스를 반환하는 단순한 정적 메서드 정적 팩터리 메서드가 생성자보다 좋은 점 이름을 가질 수 있다 정적 팩터리 메서드 BigInteger.probablePrime이 더 직관적이다. 반면, 정적 팩터리 메서드는 하나의 시그니처로 하나의 생성자만 가질 수 있는 제약을 받지 않는다. 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다. 인터페이스 기반 프레임워크: 인터페이... 이펙티브 자바이펙티브 자바 Effective Java 40장 - @Override 애너테이션을 일관되게 사용하라 사용자가 스스로 정의한 Class를 자료형으로 하는 Set 자료구조를 사용할 때에는 중복을 체크해주기 위한 equals, hashcode 등을 올바르게 재정의 해줄 필요가 있다. (Override) 이 부분에서 주로 실수하는 부분은 바로 equals를 재정의 할 때 '재정의(Override)'가 아니라 '다중정의(Overloading)'를 하는 것이다. 먼저 아래와 같은 코드는 a부터 z까지... 자바이펙티브 자바이펙티브 자바 [TIL] 2021. 02.22 코드 자체가 동작이 명확하지 않고 코드 라인이 길어지면 람다 지양 비교자 생성 메서드 혹은 List 인터페이스가 추가된 메서드 사용 2. 람다보다는 메서드 참조를 사용하라. 람다보다 더욱 간결하게 만드는 방법 : 메서드 참조(Method reference) 매개변수 수가 늘어날수록 메서드 참조로 제거 가능. 람다가 메서드 참조보다 간결할 때가 있다 메서드 참조의 유형 5가지 메서드 참조 유형... 알고리즘이펙티브 자바java streamTILTIL [이펙티브 자바] 아이템 2. 생성자에 매개변수가 많다면 빌더를 고려하라 타입이 같은 매개변수가 연달아 늘어서 있으면 찾기 어려운 버그로 이어질 수 있다. 매개변수가 없는 생성자로 객체를 만든 후, setter 메서드를 호출해 원하는 매개변수 값을 설정하는 방식 객체 하나를 만들려면 메서드를 여러 개 호출해야 한다. 클라이언트는 필요한 객체를 직접 만드는 대신, 필수 매개변수 만으로 생성자(혹은 정적 팩터리)를 호출해 빌더 객체를 얻는다. 이 빌더의 Setter ... 이펙티브 자바이펙티브 자바 [이펙티브 자바] 아이템28 | 배열보다는 리스트를 사용하라 반면, 리스트의 경우 서로 다른 타입 Type1, Type2가 있을 때, List<Type1>은 List<Type2>의 하위 타입도 아니고 상위 타입도 아니다. 배열은 이런 오류 발생을 런타임시에 알 수 있지만 리스트를 사용하면 컴파일시에 바로 알 수 있다. 그래서 Long 타입 배열에 String 타입 데이터를 입력하려고하면 ArrayStoreException이 발생한다. 반면, 리스트는 ... 이펙티브 자바이펙티브 자바 [이펙티브 자바] 객체의 생성과 파괴 Item7 - 다 쓴 객체 참조를 해제하라 "2장 - 객체의 생성과 파괴" 는 다음과 같은 기준으로 맥락을 잡고 있다. 객체를 만들어야 할 때는 언제인가 객체를 만들지 말아야 할 때는 언제인가 객체를 제 때에 파괴시키는 방법은 무엇인가 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. 다 쓴 객체 참조를 해체하라. 내가 배웠던 자바의 가장 큰 특징 중 하나는 바로 가비지 컬렉터가 있다는 것이다. 동적 메모리를 사용하기 때문에 사... Effective JavaJava이펙티브 자바스터디공부Effective Java [Java] String 의 matches 대신 Pattern 아래는 숫자인지 판단하는 정규식의 예시이다. 정규식에 대한 정보는 에서 확인할 수 있다. 위의 코드는 음수양수 모두 가능하며 0에서 9사이의 값이 한개 또는 그 이상 있을 수 있는지를 판단한다. 즉, 숫자인지 판단하는 메서드이다. 하지만 String 에서 제공하는 matches 는 내부적으로 Pattern 객체를 생성한다. String.matches 를 이용하여 검증을 한다면 매번 Patte... Java이펙티브 자바Java [이펙티브 자바] 아이템29 | 이왕이면 제네릭 타입으로 만들라 일반 클래스를 제네릭 타입으로 변경. 일반 클래스를 제네릭 타입 클래스로 바꾼다고 해도 클라이언트에는 아무런 해가 없다. 위와 같은 코드 상태로는 스택에서 꺼낸 객체를 형변환해야 하는데 이때 런타임 오류가 발생할 가능성이 있다. 따라서 제네릭 타입 클래스로 바꾸는것이 좋다. 일반 클래스에서 제네릭 타입 클래스로 만드는 시작은 타입 매개변수를 추가하는 것이다. [제네릭 스택으로 변경] 위 코드... 이펙티브 자바이펙티브 자바